/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import ejb.excepciones.ExcepcionExistencias;
import ejb.negocio.CompraServiceLocal;
import ejb.negocio.ProductoCompra;
import entidades.Pedido;
import entidades.Producto;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import org.primefaces.event.DragDropEvent;

/**
 *
 * @author ribadas
 */
@ManagedBean(name = "carroCompraController")
@SessionScoped
public class CarroCompraController extends BaseController {

    // Atributos
    ProductoCompra productoCompraActual = null;
    Pedido pedido = null;
    double importeTotal;
    Producto productoSeleccionado = null;  // Usado en ejemplo Primefaces
    // Acceso al Managed Bean usuarioController (necesario para recuperar datos del cliente actual)
    @ManagedProperty(value = "#{usuarioController}")
    UsuarioController usuarioController;

    public UsuarioController getUsuarioController() {
        return usuarioController;
    }

    public void setUsuarioController(UsuarioController usuarioController) {
        this.usuarioController = usuarioController;
    }
    // EJBs
    @EJB
    CompraServiceLocal compraService;

    /** Creates a new instance of CarroCompraController */
    public CarroCompraController() {
    }

    // Acciones
    public String doAnadirProducto(long idProducto) {
        String destino = null;
        compraService.anadirProducto(idProducto, 1);
        importeTotal = compraService.calcularImporteTotal();
        return destino; // Se queda en la misma página (lista de productos)
    }

    public String doIncrementarCantidad(long idProducto) {
        String destino = null;
        compraService.incrementarCantidad(idProducto, 1);
        importeTotal = compraService.calcularImporteTotal();
        return destino;  // Se queda en la misma página
    }

    public String doEliminarProducto(long idProducto) {
        String destino = null;
        compraService.eliminarProducto(idProducto);
        importeTotal = compraService.calcularImporteTotal();
        return destino; // Se queda en la misma página
    }

    public String doActualizarCarro() {
        String destino = null;
        importeTotal = compraService.calcularImporteTotal();
        return destino;
    }

    public String doConfirmarCarroCompra() {
        String destino = null;
        if (usuarioController.getClienteActual() == null) {
            anadirMensajeError("No hay un cliente registrado vinculado a esta compra");
            //destino = "compra.sin.cliente";
            destino = null; // recargar la pagina informando del error
        } else {
            try {
                compraService.establecerCliente(usuarioController.getClienteActual().getId());
                compraService.confirmarCarro();
                pedido = compraService.generarPedido();
                destino = "compra.completada";
            } catch (ExcepcionExistencias e) {
                anadirMensajeError("Existencias insuficientes del producto " + e.getDescripcionProducto());
                //destino = "compra.sin.existencias";
                destino = null; // recargar la pagina informando del error
            }
        }
        return destino;
    }

    public String doVaciarCarroCompra() {
        String destino = null;
        vaciarCarro();
        return "carroCompra.xhtml";   // Fuerza a reconstruir la página
    }

    // Metodos get y set
    public double getImporteTotal() {
        return importeTotal;
    }

    public void setImporteTotal(double importeTotal) {
        this.importeTotal = importeTotal;
    }

    public ProductoCompra getProductoCompraActual() {
        return productoCompraActual;
    }

    public void setProductoCompraActual(ProductoCompra productoCompraActual) {
        this.productoCompraActual = productoCompraActual;
    }

    public List<ProductoCompra> getProductos() {
        return compraService.obtenerCarroCompra();
    }

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public Producto getProductoSeleccionado() {
        System.out.println("<<<<<<< recupera " + productoSeleccionado);

        return productoSeleccionado;
    }

    public void setProductoSeleccionado(Producto productoSeleccionado) {
        System.out.println(">>>>> actualiza " + productoSeleccionado);
        this.productoSeleccionado = productoSeleccionado;
    }

    // Manejadores de eventos (para ejemplo Ajax con Primefaces)
    public void onProductoDrop(DragDropEvent ddEvent) {
        Producto p = ((Producto) ddEvent.getData());

        compraService.anadirProducto(p.getId(), 1);
        importeTotal = compraService.calcularImporteTotal();
    }

    public void onProductoIncrementoDecremento(Producto producto, int cantidad) {        
        compraService.actualizarCantidad(producto.getId(), cantidad);
        importeTotal = compraService.calcularImporteTotal();
    }

    
    public void onProductoEliminar(Producto producto) {
        System.out.println("::::::::::::::: enre conm "+producto);
        compraService.eliminarProducto(producto.getId());
        importeTotal = compraService.calcularImporteTotal();
    }
        
        
    // Metodos publicos
    public void vaciarCarro() {
        compraService.vaciarCarro();
        importeTotal = 0.0;
    }
    // Metodos privados
}
